package com.atguigu.spzx.product.service.impl;

import com.atguigu.spzx.model.entity.product.Category;
import com.atguigu.spzx.model.entity.product.ProductSku;
import com.atguigu.spzx.product.mapper.CategoryMapper;
import com.atguigu.spzx.product.service.CategoryService;
import com.atguigu.spzx.product.util.CategoryUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<Category> findOneCategory() {
        List<Category> categoryList = categoryMapper.selectFirstCategory();
        return categoryList;
    }

    //@Cacheable -> spring cache 框架的缓存注解，用于替代 redis公式化缓存代码。
    @Cacheable(value = "findCategoryTree",key = "'all'")
    //注意value是redis的key的前面固定的一段,key是可以用#+方法参数名 与方法参数进行联动的灵活的一段  (可做特殊化key的处理.)
    @Override
    public List<Category> findCategoryTree() {
        //因为是基本固定查询的分类数据,所以这里可以用redis缓存
        //1.去reids缓存里查看有没有分类数据
        //2.如果有则取出来返回
        //3.如果没有则去数据库查询分类数据,存入缓存一份,然后将数据返回.
        //如此套路的redis缓存,可以通过自己写一个aop用注解来给需要缓存的方法添加redis缓存.
        //除此之外还有spring-cache 已经帮我们整合直接用注解就可以了.


        //查找一个自关联表数据,并且拼装好树形结构
        List<Category> categoryList=categoryMapper.selectCategoryAll();
        List<Category> treeList= CategoryUtil.buildTree(categoryList);
        return treeList;
    }


}
